home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / lib-old / dircmp.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  7KB  |  237 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. '''A class to build directory diff tools on.'''
  5. import os
  6. import dircache
  7. import cmpcache
  8. import statcache
  9. from stat import *
  10.  
  11. class dircmp:
  12.     '''Directory comparison class.'''
  13.     
  14.     def new(self, a, b):
  15.         '''Initialize.'''
  16.         self.a = a
  17.         self.b = b
  18.         self.hide = [
  19.             os.curdir,
  20.             os.pardir]
  21.         self.ignore = [
  22.             'RCS',
  23.             'tags']
  24.         return self
  25.  
  26.     
  27.     def run(self):
  28.         '''Compare everything except common subdirectories.'''
  29.         self.a_list = filter(dircache.listdir(self.a), self.hide)
  30.         self.b_list = filter(dircache.listdir(self.b), self.hide)
  31.         self.a_list.sort()
  32.         self.b_list.sort()
  33.         self.phase1()
  34.         self.phase2()
  35.         self.phase3()
  36.  
  37.     
  38.     def phase1(self):
  39.         '''Compute common names.'''
  40.         self.a_only = []
  41.         self.common = []
  42.         for x in self.a_list:
  43.             if x in self.b_list:
  44.                 self.common.append(x)
  45.                 continue
  46.             self.a_only.append(x)
  47.         
  48.         self.b_only = []
  49.         for x in self.b_list:
  50.             if x not in self.common:
  51.                 self.b_only.append(x)
  52.                 continue
  53.         
  54.  
  55.     
  56.     def phase2(self):
  57.         '''Distinguish files, directories, funnies.'''
  58.         self.common_dirs = []
  59.         self.common_files = []
  60.         self.common_funny = []
  61.         for x in self.common:
  62.             a_path = os.path.join(self.a, x)
  63.             b_path = os.path.join(self.b, x)
  64.             ok = 1
  65.             
  66.             try:
  67.                 a_stat = statcache.stat(a_path)
  68.             except os.error:
  69.                 why = None
  70.                 ok = 0
  71.  
  72.             
  73.             try:
  74.                 b_stat = statcache.stat(b_path)
  75.             except os.error:
  76.                 why = None
  77.                 ok = 0
  78.  
  79.             if ok:
  80.                 a_type = S_IFMT(a_stat[ST_MODE])
  81.                 b_type = S_IFMT(b_stat[ST_MODE])
  82.                 if a_type != b_type:
  83.                     self.common_funny.append(x)
  84.                 elif S_ISDIR(a_type):
  85.                     self.common_dirs.append(x)
  86.                 elif S_ISREG(a_type):
  87.                     self.common_files.append(x)
  88.                 else:
  89.                     self.common_funny.append(x)
  90.             a_type != b_type
  91.             self.common_funny.append(x)
  92.         
  93.  
  94.     
  95.     def phase3(self):
  96.         '''Find out differences between common files.'''
  97.         xx = cmpfiles(self.a, self.b, self.common_files)
  98.         (self.same_files, self.diff_files, self.funny_files) = xx
  99.  
  100.     
  101.     def phase4(self):
  102.         '''Find out differences between common subdirectories.
  103.         A new dircmp object is created for each common subdirectory,
  104.         these are stored in a dictionary indexed by filename.
  105.         The hide and ignore properties are inherited from the parent.'''
  106.         self.subdirs = { }
  107.         for x in self.common_dirs:
  108.             a_x = os.path.join(self.a, x)
  109.             b_x = os.path.join(self.b, x)
  110.             self.subdirs[x] = newdd = dircmp().new(a_x, b_x)
  111.             newdd.hide = self.hide
  112.             newdd.ignore = self.ignore
  113.             newdd.run()
  114.         
  115.  
  116.     
  117.     def phase4_closure(self):
  118.         '''Recursively call phase4() on subdirectories.'''
  119.         self.phase4()
  120.         for x in self.subdirs.keys():
  121.             self.subdirs[x].phase4_closure()
  122.         
  123.  
  124.     
  125.     def report(self):
  126.         '''Print a report on the differences between a and b.'''
  127.         print 'diff', self.a, self.b
  128.         if self.a_only:
  129.             print 'Only in', self.a, ':', self.a_only
  130.         
  131.         if self.b_only:
  132.             print 'Only in', self.b, ':', self.b_only
  133.         
  134.         if self.same_files:
  135.             print 'Identical files :', self.same_files
  136.         
  137.         if self.diff_files:
  138.             print 'Differing files :', self.diff_files
  139.         
  140.         if self.funny_files:
  141.             print 'Trouble with common files :', self.funny_files
  142.         
  143.         if self.common_dirs:
  144.             print 'Common subdirectories :', self.common_dirs
  145.         
  146.         if self.common_funny:
  147.             print 'Common funny cases :', self.common_funny
  148.         
  149.  
  150.     
  151.     def report_closure(self):
  152.         """Print reports on self and on subdirs.
  153.         If phase 4 hasn't been done, no subdir reports are printed."""
  154.         self.report()
  155.         
  156.         try:
  157.             x = self.subdirs
  158.         except AttributeError:
  159.             return None
  160.  
  161.         for x in self.subdirs.keys():
  162.             print 
  163.             self.subdirs[x].report_closure()
  164.         
  165.  
  166.     
  167.     def report_phase4_closure(self):
  168.         '''Report and do phase 4 recursively.'''
  169.         self.report()
  170.         self.phase4()
  171.         for x in self.subdirs.keys():
  172.             print 
  173.             self.subdirs[x].report_phase4_closure()
  174.         
  175.  
  176.  
  177.  
  178. def cmpfiles(a, b, common):
  179.     """Compare common files in two directories.
  180.     Return:
  181.         - files that compare equal
  182.         - files that compare different
  183.         - funny cases (can't stat etc.)"""
  184.     res = ([], [], [])
  185.     for x in common:
  186.         res[cmp(os.path.join(a, x), os.path.join(b, x))].append(x)
  187.     
  188.     return res
  189.  
  190.  
  191. def cmp(a, b):
  192.     """Compare two files.
  193.     Return:
  194.         0 for equal
  195.         1 for different
  196.         2 for funny cases (can't stat, etc.)"""
  197.     
  198.     try:
  199.         if cmpcache.cmp(a, b):
  200.             return 0
  201.         
  202.         return 1
  203.     except os.error:
  204.         return 2
  205.  
  206.  
  207.  
  208. def filter(list, skip):
  209.     '''Return a copy with items that occur in skip removed.'''
  210.     result = []
  211.     for item in list:
  212.         if item not in skip:
  213.             result.append(item)
  214.             continue
  215.     
  216.     return result
  217.  
  218.  
  219. def demo():
  220.     '''Demonstration and testing.'''
  221.     import sys as sys
  222.     import getopt as getopt
  223.     (options, args) = getopt.getopt(sys.argv[1:], 'r')
  224.     if len(args) != 2:
  225.         raise getopt.error, 'need exactly two args'
  226.     
  227.     dd = dircmp().new(args[0], args[1])
  228.     dd.run()
  229.     if ('-r', '') in options:
  230.         dd.report_phase4_closure()
  231.     else:
  232.         dd.report()
  233.  
  234. if __name__ == '__main__':
  235.     demo()
  236.  
  237.